package com.mark.user.util;

import com.mark.basic.jwt.JwtUtils;
import com.mark.basic.jwt.RsaUtils;
import com.mark.basic.jwt.UserInfo;
import com.mark.org.mapper.WxuserMapper;
import com.mark.system.domain.Menu;
import com.mark.system.mapper.MenuMapper;
import com.mark.system.mapper.PermissionMapper;
import com.mark.user.domain.Logininfo;
import com.mark.user.mapper.LogininfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.FileCopyUtils;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Jwt {
    @Autowired
    private MenuMapper menuMapper; // 菜单
    @Autowired
    private PermissionMapper permissionMapper;  // 角色 按钮
    @Value("${jwt.rsa.pri}") // 私钥的文件名
    private String jwtRsaPrivate;
    /**
     * 登录成功之后的业务
     * @param logininfo
     */
    private Map<String, Object> loginSuccessHandler(Logininfo logininfo) {
        UserInfo userInfo = new UserInfo();
        userInfo.setUser(userInfo); // 当前登录人
        // 判断是前端用户还是管理用户
        if (logininfo.getType() == 1){ // 前端用户
            // 前端不用管权限，管理者才需要
            userInfo.setMenus(null);
            userInfo.setMenus(null);
        }else { // 管理者
            // 查询当前登录人的权限
            // 1、菜单权限
            List<Menu> menus = menuMapper.loadMenuByLogininfoId(logininfo.getId());
            // 2、按钮属性
            List<String> permissionSns = permissionMapper.loadPerssionSnByLogininfoId(logininfo.getId());
            // 将有用的权限放入数据中
            userInfo.setMenus(menus);
            userInfo.setPermissions(permissionSns);
        }
        // 将权限信息和登录信息封装成Jwt串
        //获取私钥
        try {
            //获取私钥
            PrivateKey privateKey = RsaUtils
                    .getPrivateKey(FileCopyUtils
                            .copyToByteArray(this.getClass().getClassLoader().getResourceAsStream(jwtRsaPrivate)));
            // 将数据封装成JWT串
            String token = JwtUtils.generateTokenExpireInMinutes(userInfo, privateKey, 30);
            // 将数据传给前台
            Map<String, Object> map = new HashMap<>();
            map.put("token",token);//JWT串  当前登陆人的信息  菜单信息  按钮信息
            //由于我们的前端没有写JWT解密实现，所以我们直接将信息还是原样放回给前端
            logininfo.setSalt(null);
            logininfo.setPassword(null);
            map.put("logininfo",logininfo);
            map.put("menus",userInfo.getMenus());
            map.put("permissions",userInfo.getPermissions());
            return map;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }
}